home *** CD-ROM | disk | FTP | other *** search
Text File | 1991-08-25 | 148.2 KB | 4,078 lines |
-
-
-
-
-
-
- OVERVIEW .
-
- ..
- .
- .
- .
- .
- .
- .
- .
-
- .
- .
- .
- ..
-
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- ..
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
-
- .
- ..
- .
- .
- .
- 1
-
- INTRODUCTION
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- ..
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- 1
-
-
- What is Shareware
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- ..
- .
- .
- .
- 1
-
- LICENSE, WARRANTY AND REGISTRATION .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- 2
-
- LICENSE .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- 2
-
-
- WARRANTY
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- ..
- .
- .
- .
- .
- .
- .
- 2
-
- REGISTRATION .
- .
- .
- .
- .
- .
- .
- .
-
- ..
- .
- .
- .
- .
- .
- .
-
- ..
- .
- .
-
- ..
- .
- .
-
- ..
- .
- .
- .
- .
- .
- .
-
- ..
- .
- .
-
- ..
- .
- .
-
- ..
- .
- .
- .
- .
- .
- 2
-
- IS REGISTRATION WORTHWHILE? .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
-
- ..
- .
- .
-
- ..
- .
- .
-
- ..
- .
-
- ..
- 2
-
-
- Serial Port Fundamentals .
-
- ..
- .
- .
- .
- .
- .
- .
-
- ..
-
- ..
-
- ..
- .
- .
- .
- .
- .
- .
- .
- .
- .
-
- ..
- .
- .
-
- .
- ..
- .
-
- .
- ..
-
- ..
- .
-
- .
- . 3
-
- The 8250 UART family .
-
- ..
- .
-
- ..
-
- ..
-
- ..
-
- ..
- .
- .
-
- ..
-
- .
- .
- ..
-
- ..
-
- ..
-
- ..
-
- ..
- .
- .
- .
- .
-
- ..
-
- ..
- .
-
- ..
- .
-
- . 3
-
- Purpose of the port .
- .
- .
-
- ..
- .
- .
- .
- .
- .
-
- ..
- .
-
- ..
-
- ..
- .
- .
- .
-
- ..
-
- ..
- .
- .
- .
- .
- .
- .
-
- ..
- .
- .
- .
- .
- .
-
- ..
- .
- 3
-
-
- INTERNAL PORT DETAILS .
- .
-
- ..
- .
- .
- .
-
- ..
-
- .
- .
- ..
-
- ..
- .
- .
-
- .
- .
- ..
-
- ..
- .
-
- .
- .
- .
- ..
-
- .
- .
- ..
-
- .
- ..
-
- ..
- .
-
- . 3
-
- The Interrupt Connection
- .
- .
- ..
- .
-
- ..
- .
- .
-
- .
- ..
-
- .
- .
- .
- ..
-
- .
- .
- .
- ..
- .
- .
- .
-
- ..
-
- .
- .
- .
- ..
-
- ..
- .
- 4
-
-
- THE PORT REGISTERS
-
-
-
-
-
-
-
-
-
-
-
- LiteComm
-
-
- Communications ToolBox
-
-
- Copyright 1987 - 1991
-
- Information Technology, Ltd.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Information Technology
-
- 5 Park Blvd.
-
- Lincoln, RI 02865
-
- (401) 724-2730
-
-
-
-
-
- OVERVIEW
-
-
-
-
- INTRODUCTION
-
-
- TM
-
- The LiteComm ToolBox is a set of powerful routines designed to
-
- provide easy access to the full capabilities of the PC's asynch-
-
- ronous communications ports. The LiteComm ToolBox provides
-
- interrupt-driven, buffered communications support on COM1 through
-
- COM4 simultaneously. Now you can quickly incorporate sophis-
-
- ticated communications support in your applications without hav-
-
- ing in-depth knowledge of how the hardware functions.
-
-
- LiteComm is the result of meeting a need for communications in
-
- CAD/CAM applications created for a client company. Each version
-
- of the LiteComm ToolBox depends upon its respective host compil-
-
- er.
-
-
-
- The 'Lite' in LiteComm refers to the high granularity of the
-
- product. LiteComm, in simple applications, adds about 5K bytes of
-
- overhead. Yet it provides a highly reliable base on which to
-
- build.
-
-
- As you use LiteComm, you will find yourself in good company. Li-
-
- teComm is currently in use at ATT, IBM, NASA, and the Associated
-
- Press, to name a few of our users. In addition, LiteComm has been
-
- featured in at least one book, Straight Talk by Charles Bowen and
-
- Stewart Schneider. Finally, the Turbo Pascal version of LiteComm
-
- is the basis for the Async Professional package from Turbopower
-
- Software.
-
-
-
- What is Shareware
-
- Shareware is a "try before you buy" means of software distribu-
-
- tion. If you find a shareware product useful, pay the registra-
-
- tion fee, and let the authors know that you support their
-
- efforts.
-
-
-
- Information Technology is a member of the Association of Share-
-
- ware Professionals (ASP). ASP wants to make sure that the
-
- shareware principle works for you. If you are unable to resolve
-
- a shareware-related problem with an ASP member by contacting the
-
- member directly, ASP may be able to help. The ASP Ombudsman can
-
- help you resolve a dispute or problem with an ASP member, but
-
- does not provide technical support for members' products. Please
-
- write to the ASP Ombudsman at P.O. Box 5786, Bellevue, WA 98006
-
- or send a Compuserve message via easyplex to ASP Ombudsman
-
- 70007,3536.
-
-
-
-
-
-
- 1
-
-
-
-
-
- LICENSE, WARRANTY AND REGISTRATION
-
- LICENSE
-
- Information regarding the LiteComm license will be found in the
-
- file LICENSE.DOC, on the distribution diskette. Please read this
-
- information. By your use of LiteComm, we assume that you agree to
-
- the terms and conditions of the license agreement.
-
-
-
- If you are interested in a site license for LiteComm, please see
-
- the file SITELICE.DOC on the distribution disk.
-
-
- WARRANTY
-
-
- The LiteComm warranty is in the distributed file WARRANTY.DOC. Be
- sure you read the warranty before using LiteComm.
-
-
-
- REGISTRATION
-
- Registration information and an order form are in the file
-
- REGISTER.DOC.
-
-
-
- IS REGISTRATION WORTHWHILE?
-
- LiteComm is a package undergoing continuing development. We are
-
- constantly reviewing the product to make it smaller, faster, more
-
- reliable, and easier to use. Since its introduction in mid 1987,
-
- we have made significant changes to the LiteComm kernel, the
-
- heart of the ToolBox, to improve efficiency and reliability. We
-
- have also delivered to registered users protocol engines, LXM -
-
- the Xmodem engine, which supports Xmodem and Xmodem-1K; and LWXM
-
- - the Windowed Xmodem engine. We also provide a version of the
-
- Compuserve QUICKB protocol, specially adapted for use with the
-
- LiteComm ToolBox.
-
-
-
- We are also reviewing other protocol engine implementations. In
-
- this release of LiteComm, for example, we have added support for
-
- True YModem and ZModem. The small model library, as enhanced will
-
- always be offered as a shareware product.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 2
-
-
-
-
-
- Serial Port Fundamentals
-
-
-
-
- The 8250 UART family
-
-
- This portion of the manual provides you with some details about
- the working of the 8250 (and related) UART'S, the basic component
-
- of your system's serial port. Some close compatibles use en-
-
- hanced versions of this chip, such as the 16450 and 16550.
-
- LiteComm works successfully with such devices. If you have
-
- questions about the type of serial port you are using, refer to
-
- the manufacturer's documentation. If your serial port does not
-
- use an 8250 or similar chip, LiteComm will not function.
-
-
-
- Purpose of the port
-
- The serial port converts information from the form in which it is
-
- used within your system, to a form that can be easily used out-
-
- side your system. Modern computers, by design, are parallel in
-
- nature. By this we mean that information travels through the
-
- computer's circuitry as whole units or as multiples of whole
-
- units. In the IBM PC and related systems, information travels as
-
- bytes (8 bits at a time), as words (16 bits at a time), or, on
-
- 80386 and 80486 based systems, as double words (32 bits at a
-
- time).
-
-
-
- Within the computer, such arrangements are convenient and fast.
-
- When the computer must transfer information to an external de-
-
- vice, data path width is a problem. To provide a parallel path
-
- between the computer and external devices, there would have to be
-
- enough data lines or circuits between the two to satisfy the data
-
- path. For most modern computer systems, this would mean a mini-
-
- mum of 8 data lines, not counting any additional control
-
- information that also might be necessary. For certain newer
-
- systems, the requirement might be for as many as 32 data lines.
-
- In effect, it might be necessary to have several different ver-
-
- sions of a device, dependent upon the data path width of the
-
- computer.
-
-
- The purpose of a serial port is to convert the information from
-
- its internal, parallel form, to a more common, external form and
-
- back. By using such an approach, we simplify the interconnection
-
- of devices, reducing information to its lowest common denomina-
-
- tor, the bit. It allows us to transfer information 1 bit at a
-
- time, using a single data path, between devices. The real beauty
-
- of this approach is that, by agreeing on how this external form
-
- appears, each device can hide the details of how it works, and
-
- still do the required task.
-
-
-
- INTERNAL PORT DETAILS
-
- In this section we discuss the fundamental working of serial
-
- ports on the IBM PC and close compatible systems. It is not es-
-
- sential that you understand this material thoroughly to be
-
- successful with LiteComm. Still, it may help to answer some more
-
-
- 3
-
-
-
-
-
- important questions that may arise as you proceed with your de-
-
- velopment.
-
-
- The Interrupt Connection
-
- The PC is an interrupt driven system. This is a sophisticated way
-
- of saying that the PC can pay attention to several internal de-
-
- vices. It doesn't have to check on, or poll, them periodically.
-
-
-
- The method by which 80x86 family interrupts work is elegant in
-
- its simplicity. When a device needs the attention of the system,
-
- its asserts a control signal and identifies itself with a number
-
- ranging from 0 to 255. On the basic PC, the numbers used range
-
- from 8 through 15 decimal. PC components translate the
-
- identification to a memory location by multiplying the identifi-
-
- cation by 4. The system then simulates a special form of a call
-
- to the routine whose address is at that memory location. Since
-
- it is impossible to predict when a device will require attention,
-
- the system uses the far address of the routine, both segment and
-
- offset, therefore the 4.
-
-
- Once called, this routine, called the Interrupt Service Routine
-
- or ISR, has a duty to save the state of the system when the in-
-
- terrupt occurred. It must take care of the interrupt as quickly
-
- as possible, and return control to the interrupted process. It
-
- also must be aware that, while it is doing its work, other, more
-
- important devices may require attention, too.
-
-
-
- One device that requires constant attention is the system clock
-
- that ticks roughly 18 times per second. In part, the PC makes
-
- provision for this by prioritizing the interrupt scheme. The ISR
-
- must allow for this by reenabling the interrupt control system as
-
- rapidly as it is practical to do so. The PC's interrupt struc-
-
- ture, if left undisturbed, will prevent interrupts of the same or
-
- lower priority from occurring. To help you organize your
-
- thoughts, the standard identifications for the first two serial
-
- ports on the system are 12 (0C) and 11 (0B) for ports 1 and 2
-
- respectively.
-
-
- However, the intrreupt structure of the PC is far from perfect.
-
- Systems that use the original ISA buss have a shortcoming. Only
-
- one device is allowed to occupy an interrupt vector or location
-
- at a time. This is in contrast to systems that employ either the
-
- micro-channel buss or the EISA buss. In these latter two buss
-
- designs, multiple devices may occupy a single intterupt location.
-
-
-
- As you can see, dealing with the PC's interrupt structure is not
-
- for the faint of heart. It requires a significant amount of
-
- knowledge, and close attention to detail. LiteComm takes care of
-
- these details for you. You are free to focus on your applica-
-
- tion, treating the serial port in much the same way that you
-
- would any DOS file.
-
-
-
-
- 4
-
-
-
-
-
- THE PORT REGISTERS
-
- The 8250 port is fully programmable. LiteComm has already taken
-
- care of the intricacies of this programming. But some additional
-
- information about each register used in the serial port may be of
-
- use when you are attempting to communicate with an external de-
-
- vice. For the sake of this discussion, we use the basic register
-
- numbers. The actual register number used is the register number
-
- referenced below used as an offset to a base port number. For
-
- COM1 (port 1), this base is 3F8(hexadecimal).
-
-
-
- register 0 - transmit/receive
- register 0 - transmit/receive
- register 0 - transmit/receive
-
- In normal operation, the ISR reads individual characters from
-
- register 0 when the become available. The ISR writes to register
-
- 0 when the transmitter portion of the 8250 is ready to accept a
-
- character.
-
-
- register 0 - baud rate selection
- register 0 - baud rate selection
- register 0 - baud rate selection
-
-
- During initialization, register 0 is part of the mechanism that
- sets baud rate. During this process, register 0 and its compan-
-
- ion register 1 specify the baud rate divisor (not the actual baud
-
- rate). The baud rate divisor is a value that, when divided into a
-
- given, preset constant, yields the desired baud rate. To set the
-
- baud rate, you must first enable access to this mode. This is
-
- done by writing a value of 80H to register 3, the line control
-
- register. Once complete, the least significant byte (LSB) of the
-
- divisor is written to register 0; the most significant byte is
-
- written to register 1. Access to the normal modes of registers 0
-
- and 1 are reenabled by writing any value less than 80H to the
-
- line control register. Of course, only certain values less than
-
- 80H would be meaningful (see the line control register descrip-
-
- tion below).
-
-
-
- register 1 - interrupt enable
- register 1 - interrupt enable
- register 1 - interrupt enable
-
- Values written to register 1 control the conditions that will
-
- cause the 8250 to interrupt the system. There are four possible
-
- conditions that can cause interrupts:
-
-
-
- 1. A character has been received (RDI)
- (RDI)
- (RDI)
-
- 2. The transmitter is ready to send a character (TDI)
- (TDI)
- (TDI)
-
- 3. An error or BREAK signal has been detected (ERI)
- (ERI)
- (ERI)
-
-
- 4. A modem status signal has changed (MSI)
- (MSI)
- (MSI)
-
-
- The designations, in parentheses, are for our purposes only. They
-
- are not 'standard' designations. To enable a particular type of
-
- interrupt, you must set the corresponding bit in a byte to a 1,
-
- then write the byte to register 1. To reset (ignore) the condi-
-
- tion, set the corresponding bit to 0. The diagram that follows
-
- shows the bit positions the correspond to the various conditions
-
- described above.
-
-
-
-
-
- 5
-
-
-
-
-
- N/A N/A N/A N/A Modem Error/ Xmit Recv
-
- Status Break Ready Char
-
- 7 6 5 4 3 2 1 0
-
- Register 1 Bit Definitions
-
-
-
- register 1 - baud rate selection
- register 1 - baud rate selection
- register 1 - baud rate selection
-
-
- See the description under register 0, baud rate selection.
-
-
-
- register 2 - interrupt identification
- register 2 - interrupt identification
- register 2 - interrupt identification
-
-
- Register 2, in normal operation, acts as a companion to register
-
- 1. Register 1 determines the conditions that can cause an
-
- interrupt. Register 2 identifies the specific condition that
-
- caused the interrupt, when more than one condition is enabled.
-
- The least significant 3 bits of the register contain the identi-
-
- fication. See the diagram of register 2 that follows.
-
-
-
- N/A N/A N/A N/A N/A Int ID Int ID Int
-
- Pend
-
- 7 6 5 4 3 2 1 0
-
- Register 2 Bit Definitions
-
-
-
- Since it is possible, even likely, that more than one condition
-
- may occur simultaneously, bit 0 tells whether all conditions that
-
- currently exist have been handled. When bit 0 has a value of 0
-
- (yes zero), there are conditions waiting to be handled. When bit
-
- 0 has a value of 1, all outstanding conditions have been handled.
-
- Bits 2 and 1 taken together identify the actual cause of the in-
-
- terrupt.
-
-
- Again, because of the multiple conditions that may occur, the
-
- 8250 presents the conditions in a prioritized order. When bits 2
-
- and 1 have a value of 3 (the most important), an ERI
- ERI
- ERI condition
-
- exists. The actual error can be read from the line status regis-
-
- ter(register 5). Reading this register also clears the condition.
-
-
-
- When a value of 2 is present, an RDI
- RDI
- RDI condition has occurred, and
-
- a character should be read from port 0. If the character is not
-
- read quickly enough, a data overrun error may occur, indicating
-
- the loss of a character.
-
-
- When bits 2 and 1 have a value of 1, a TDI
- TDI
- TDI condition has occurred
-
- and a character may be written to register 0.
-
-
-
- A value of zero in bits 2 and 1(least important) shows that one
-
- or more of the modem status lines (so called) have changed. The
-
- condition can be cleared by reading the contents of the modem
-
- status register, register 6.
-
-
-
- 6
-
-
-
-
-
- register 3 - line control
- register 3 - line control
- register 3 - line control
-
- The line control register gives the means for setting those val-
-
- ues that affect the way in which the serial port appears to the
-
- outside world. It is through this register that the program es-
-
- tablishes character length, parity, and other significant values.
-
- Indirectly, register 3 also plays a role in setting the speed
-
- (baud rate) of the port. (See the description of registers 0 and
-
- 1.)
-
-
-
- Baud Send Force Parity Enable Stop Char Char
-
- Div Break Parity Type Parity Bits Len Len
-
- 7 6 5 4 3 2 1 0
-
- Register 3 Bit Definitions
-
-
-
-
- register 4 - modem control
- register 4 - modem control
- register 4 - modem control
-
- The modem control register permits control of the two modem- re-
-
- lated signals that the serial port generates as an output. The
-
- signals are Request To Send, RTS
- RTS
- RTS and Data Terminal Ready, DTR
- DTR
- DTR.
-
-
-
- These two signals are handshaking signals, since they, in part,
-
- help a connected device figure out the state of the connection.
-
- These signals were originally designated to be used in a specific
-
- fashion. Yet, manufacturers of specific devices have used them to
-
- meet their needs. Your success or failure in dealing with any
-
- specific device may depend, in part, on your understanding of how
-
- the device's manufacturer uses these signals. LiteComm provides
-
- you the means for manipulating these signals in a variety of
-
- ways.
-
-
- You will notice in the register 4 diagram, below that some addi-
-
- tional positions are identified.
-
-
-
- N/A N/A N/A Enable OUT2 OUT1 RTS DTR
-
- Loop (reqd)
-
- 7 6 5 4 3 2 1 0
-
- Register 4 Bit Definitions
-
-
-
- LiteComm controls these additional positions for your benefit.
-
- Only one deserves mention, the position labeled OUT2
- OUT2
- OUT2. It is
-
- necessary for this position to have a value of 1 for the serial
-
- port to function as an interrupting device. Since LiteComm relies
-
- on interrupts to perform it's job, it always sets this position
-
- correctly.
-
-
- register 5 - line status
- register 5 - line status
- register 5 - line status
-
-
- The program normally reads the line status register when an ERI
- ERI
- ERI
-
- condition occurs. Each bit of the character returned has sig-
-
- nificance, as shown in the accompanying diagram. Using the ap-
-
- propriate functions in LiteComm, you can interrogate the value in
-
- this register, and test for the various conditions using the
-
- 7
-
-
-
-
-
- LiteComm- provided definitions. Note that, due to the special
-
- nature of the BREAK
- BREAK
- BREAK signal, LiteComm treats this one condition as
-
- a separate entity.
-
-
- Time Shift Hold Recd Frame Parity Over Data
-
- Out Reg Reg Break Error Error Run Rec'd
-
- Empty Empty Error
-
- 7 6 5 4 3 2 1 0
-
-
- Register 5 Bit Definitions
-
-
- register 6 - modem status
- register 6 - modem status
- register 6 - modem status
-
-
- Just as the serial port can generate certain handshaking signals,
-
- it also can read, and report on the status of similar signals
-
- that an external device generates. In their original form, these
-
- signals had special significance for connections between a
-
- terminal and a modem. We refer you to our comments, above, about
-
- present day use of the handshaking signals.
-
-
- One special note is appropriate here. The modem status register
-
- provides two types of information. The most significant 4 bits
-
- (see the diagram) show the current state of the 4 covered sig-
-
- nals. The least significant 4 bits show which, if any, of the
-
- signals have changed state (from zero to one, or vice-versa),
-
- since the last time the register was interrogated. LiteComm up-
-
- dates its internal tables with this value in real-time, and re-
-
- ports the results when asked to do so. You can test the signals
-
- individually or in combination using the LiteComm- provided
-
- definitions.
-
-
-
- DCD RI DSR CTS Delta Delta Delta Delta
-
- Carr Ring Data Clear DCD RI DSR CTS
-
- Det Ind Set Rd Send
-
- 7 6 5 4 3 2 1 0
-
- Register 6 Bit Definitions
-
-
-
- The LiteComm Connection
-
- In the design of LiteComm, we have purposely 'hidden' many
-
- underlying details we presented above. Often, you will have
-
- little use for this additional information. This is particularly
-
- true of most of the applications with which you will come into
-
- contact. In most applications, you probably will open the port
-
- or ports, set the necessary parameters and modem control signals,
-
- and do nothing more than read and write characters using one or
-
- more of the LiteComm functions. The beauty of LiteComm's design
-
- is that its high degree of granularity doesn't force you to pay
-
- the price of dragging along functions that you are not using.
-
-
-
- The information that we presented above will help you when it is
-
- necessary to communicate with a device that requires special
-
- handshaking considerations, such as a cash drawer. You also may
-
- need the information we presented if you intend to use serial
-
- ports beyond COM2 (serial port 2).
-
- 8
-
-
-
-
-
-
- Finally, by presenting the information that we have supplied, we
-
- hope to gain a more informed user. Communications programming is
-
- not the black art that some would have you believe, although it
-
- can easily seem that way at times. Of the calls we receive with
-
- questions, more than 75 per cent could be answered by the caller
-
- himself with a more thorough understanding of the underlying
-
- concepts and rules.
-
-
-
- ToolBox NOTES AND WARNINGS
-
-
- Note:
- Note:
- Note:Special warning for old-style PC owners
-
- There is a known problem with serial ports on older systems. Due
-
- to a problem with old-style 8250 and 16450 UARTS, it is possible
-
- for the transmitter to stop functioning. This problem is cuased
-
- by a loss of interrupts under load. While software workarounds
-
- exist, we have decided not to include such workarounds in Lite-
-
- Comm. Inclusion of this logic would result in added overhead to
-
- all LiteComm users. If you believe you are experiencing this
-
- problem, please contact us.
-
-
-
- Note:
- Note:
- Note:Open Required
-
- Before you can send or receive information on a serial port using
-
- the ToolBox, you must use the open function to enable the line.
-
- This function initializes the UART with the correct parameters,
-
- and introduces the UART into the interrupt structure of the PC.
-
- The ToolBox will detect, and report, any errors that you may make
-
- in selecting the port or specifying the initial parameters.
-
-
-
- Note:
- Note:
- Note:Close Required
-
- The ToolBox interfaces directly with the interrupt structure of
-
- the PC. It is critical before exiting a program that has opened a
-
- serial port that the serial port is closed with the close func-
-
- tion. Since it is possible for a program to terminate abnormally,
-
- the open function installs an exit routine that will
-
- automatically close any open ports. Good programming practice
-
- demands that your program should close the ports explicitly. By
-
- so doing, you may avoid problems in the future if we find it
-
- necessary to remove the auto-close functionality. Further, the
-
- auto-close functionality drops all modem handshaking signals ab-
-
- solutely, while an explicit close can decide whether to drop
-
- these signals. If you are unaware of exit functions, check your
-
- compiler's documentation for the atexit() function for a complete
-
- explanation. Review the description of the comm_close() function,
-
- as well.
-
-
- Failure of the open function can result from several causes, im-
-
- proper parameters to the open function, a non-existant serial
-
- port or insufficient memory. The memory is needed for the re-
-
- quested buffers and related control structures for the port.
-
- Memory for the transmit and receive buffers as well as the port
-
- control block is allocated from free memory. It is your
-
- responsibility to insure that adequate memory is available for
-
-
- 9
-
-
-
-
-
- this purpose. This requires no particular action on your part.
-
- If you use LiteComm in combination with other packages, the other
-
- packages may place specific restrictions on your use of free
-
- memory.
-
-
- Note:
- Note:
- Note:Handshaking Signals
-
- The ToolBox will, at your option, assert both the DTR and RTS
-
- signals when you open the port. If you do not select this option
-
- you must use the lc_setmdm function to assert (raise) this sig-
-
- nal. In addition, some modems and other devices may require you
-
- to assert either the DTR (Data Terminal Ready) or the RTS (Re-
-
- quest To Send) signal before they will respond to data. Please
-
- note that the use of handshaking signals is HIGHLY hardware-
-
- dependant. The ToolBox provides all the functionality necessary
-
- for you to implement almost any handshaking scheme that might be
-
- required.
-
-
-
- WARNING
- WARNING
- WARNING
-
- Due to the use of all available interrupt modes of the 8250, one
-
- user has discovered an unusual set of circumstances that can be
-
- troublesome. If the 8250 chip detects an error condition, such
-
- as a parity error, framing error, or data overrun error, it
-
- causes an interrupt to which the ToolBox will respond. If these
-
- errors occur frequently enough, the ToolBox code will spend too
-
- much time handling the errors, and lose characters, causing
-
- additional errors. If you encounter a situation in which your
-
- application appears to behave erratically, especially at higher
-
- speeds, investigate the following table.
-
-
-
- Possible Error Conditions
-
- Is the cabling to the other device sound and solidly con-
-
- nected?
-
- Are any of the signals in the cable 'floating' or are they all
-
- properly terminated?
-
-
-
- Is the other device functioning properly? We have encountered
-
- situations in which a serial port on some devices tends to be
-
- sloppy in terms of voltage levels, bit timings, and similar
-
- problems. Any, or all, these situations can cause the erratic
-
- operation to which we referred.
-
-
- WARNING
- WARNING
- WARNING
-
-
- Unless you are very familiar with the interrupt structure of the
-
- PC, do not attempt to manipulate the interrupt enable flag out-
-
- side the ToolBox. The ToolBox sets and clears the interrupt en-
-
- able flag at appropriate times and assumes that it has sole
-
- control over the flag.
-
-
- Note:
- Note:
- Note:Byte Alignment
-
- Unless otherwise specified, all library functions use byte
-
- structure alignment. This alignment results from the way in which
-
- the interrupt handler was developed in assembly language.
-
-
- 10
-
-
-
-
-
-
- NEW IN VERSION 6.00
-
- In version 6.0, we have again improved on the assembly language
-
- interrupt handlers. In addition, there have been significant
-
- changes in the supporting functions to tighten the code. The
-
- result is smaller applications, often able to operate at higher
-
- baud rates.
-
-
-
- Other additions to LiteComm in version 6.0 include fully
-
- automatic flow control using either software or hardware. Both
-
- variants are programmer-configurable. This should simplify things
-
- for some users.
-
-
- In version 6.0, LiteComm will attempt to insure that you are at-
-
- tempting to open a valid COM port. If LiteComm believes that the
-
- port is not valid, it will return an error from comm_opn. The
-
- addition of a global error variable should help in determining
-
- the source of the error. See the section on LiteComm functions
-
- for additional information.
-
-
-
- And we have addressed an area that we have always considered a
-
- LiteComm weakness. In previous versions of LiteComm, it was pos-
-
- sible to detect an receive error globally, yet not know when it
-
- occurred. With version 6.0, LiteComm now buffers errors in the
-
- same way that it buffers incoming characters. At your option, you
-
- can retrieve the error status associated with a character.
-
-
- There have been numerous, less significant additions to LiteComm,
-
- as well. Many are the result of user-feedback. Nearly all are
-
- aimed at making your job simpler.
-
-
- BEYOND COM2
-
- THE ToolBox METHODOLOGY
-
- In the design of the original PC, and in subsequent variations
-
- such as the PC/AT, there was only provision for two serial ports.
-
- Many manufacturers of add-in products, both serial ports and in-
-
- ternal modems have added the capability to support 1 or more
-
- additional ports beyond the COM2 limit. Generally, this can cause
-
- problems in the PC since there is no room in the interrupt re-
-
- quest scheme for additional levels of interrupts. There are no
-
- designated interrupt vector for other additional ports.
-
-
-
- The ToolBox approach to resolving these issues is to permit the
-
- programmer a degree of control over the parameters that govern
-
- the interrupt mechanism for COM3 and COM4. Specifically, these
-
- parameters are:
-
-
- 1. The interrupt request (IRQ) bit that is used to mask the 8259
-
- interrupt controller.
-
-
- 2. The interrupt vector number (not address) to which the port is
-
- attached.
-
-
-
- 11
-
-
-
-
-
- 3. The base i/o register for the port itself. Of course, it we
-
- assume that the port is an 8250 UART or compatible device.
-
- Again, the LiteComm ToolBox will not function with non-8250
-
- type devices.
-
-
- Before you attempt to use COM3 and/or COM4, you must figure out
-
- from the port's documentation, the appropriate values for these
-
- three parameters. As distributed, the ToolBox assumes the
-
- following:
-
-
-
-
- Port COM 3 COM 4
-
- IRQ Bit 4 3
-
-
- Vector 0CH 0BH
-
- Base Register 3E8H 2E8H
-
-
-
- You may change any of these values by using the _portchg function
-
- described below, but only before you open the port with comm_opn.
-
- Once the port has been opened, _portchg is ineffective. _portchg
-
- will not work on COM1 or COM2.
-
-
- At present, LiteComm is not compatible with multiport boards such
-
- as the Digiboard. The structure of these boards generally re-
-
- quires additional programming to be used effectively. If you
-
- want to use such a board with LiteComm, please contact us
-
- directly for information on custom modifications to LiteComm. We
-
- have performed such modifications for other LiteComm users.
-
-
-
- CAUTIONS
-
- There is an intimate relationship between the IRQ setting and its
-
- related interrupt vector. In the PC, this relationship is con-
-
- trolled, in part, by the 8259 interrupt controller that is set
-
- during BIOS initialization.
-
-
-
- In brief, the BIOS settings for the PC (and most close compa-
-
- tibles) establish IRQ0 as vector number 08h, and subsequent IRQ
-
- levels at increasing vector numbers. These vector numbers (or
-
- types in INTEL terms) act as a cpu- directed call table to loca-
-
- tions in the lowest 1K of system memory. We can alter how the
-
- system responds to a given interrupt by replacing or changing the
-
- values in the associated vector position to point to a routine
-
- that we supply.
-
- Judging from the questions asked by some users of LiteComm, there
-
- is evidently some misunderstanding about using ports beyond COM2,
-
- and how this all relates to your hardware. Before you can suc-
-
- cessfully use COM3 or COM4, you must consider the following:
-
- Does the hardware permit a change to the base port and/or the
-
- interrupt vector to which the port responds? Some expansion
-
- cards will support changing one and not the other, causing po-
-
- tential hardware conflicts and lost data.
-
-
-
- 12
-
-
-
-
-
- Does the hardware permit reassignment of the IRQ priority?
-
- Some expansion cards permit you to alter the IRQ priority,
-
- some won't. Briefly, from the previous discussion, any change
-
- to the IRQ priority must allow a corresponding change to the
-
- interrupt vector number. Without this capability, reprogram-
-
- ming of the 8259 chip would be required.
-
- Many add-on cards permit this dual change simply by making a
-
- single switch or jumper setting. Unfortunately, the documenta-
-
- tion for these cards generally assumes that you are aware of
-
- the dual nature of the IRQ vector relationship, and may leave
-
- you with the impression that you are changing one and not the
-
- other. In most circumstances, this is not so.
-
-
- The point to all this is that LiteComm can only provide as much
-
- support as the hardware permits, or is capable of responding to.
-
- If you wish to use other than the default base port, interrupt
-
- vector, or irq priority for COM3 or COM4, then your expansion
-
- card must be able to support the new values; in other words,
-
- these values are all hardware-provided, and are recognized by the
-
- LiteComm software. If your hardware does not permit changing a
-
- value, LiteComm cannot improve the situation.
-
-
-
- We should, at this point, add one final caution about how inter-
-
- rupt priorities function, and their relationship to the irq bit
-
- that you may select. The standard PC permits 8 interrupt priority
-
- levels. The PC-AT and later systems permit a total of 16 inter-
-
- rupt priority levels. Regardless of system type, the programmable
-
- timer has the highest priority; the parallel printer port has the
-
- lowest priority. When an interrupt occurs, the interrupt
-
- controller (8259 chip) masks out all other interrupts from the
-
- priority of the interrupting device and all lower priority de-
-
- vices.
-
-
- As an aid to making COM3 and COM4 fit, LiteComm supports inter-
-
- rupt chaining for the COM3 and COM4 ports, on PS/2 and other mi-
-
- crochannel systems. If you use COM3 or COM4, when an interrupt
-
- occurs, the kernel will attempt to determine if the interrupt was
-
- caused by the supported port or from another source. Only the
-
- PS/2 and similar systems can reliably support interrupt chaining;
-
- it is NOT a restriction that we impose. The restriction lies in
-
- the design of the original PC and PC-AT buss structure.
-
-
-
- If the kernel determines that the supported port did not cause
-
- the interrupt, an automatic chain to the original interrupt han-
-
- dler for that interrupt level (IRQ level) will take place. This
-
- allows you to "patch in" or share the available interrupt vec-
-
- tors.
-
-
- If you intend to use other than the library-provided defaults, be
-
- sure that you understand the interrupt mechanism. The use of the
-
- automatic chaining described above can be particularly trouble-
-
- some under some circumstances, resulting in loss of interrupts
-
- and, potentially, a system crash.
-
-
-
- 13
-
-
-
-
-
- Note:
- Note:
- Note:DO NOT
- DO NOT
- DO NOT attempt to mix the ToolBox functions with other
-
- seemingly- related functions (such as the serial port BIOS calls
-
- provided in both Turbo and Microsoft C). At least two users have
-
- attempted to use only the receive portions of LiteComm, while
-
- resorting to the BIOS functions to send characters or adjust port
-
- parameters such as baud rate. The results, at best, have been
-
- failure of the user's application to function, and, at worst,
-
- total system lockup. This mix of functions is NOT supported and
-
- must not be used. If you attempt such a mix, we cannot help you.
-
-
- If you chose to share the interrupt vectors for COM1 or COM2, you
-
- must be certain to open COM1 (COM2) last. The interrupt chaining
-
- mechanism only works with COM3 and COM4. Failure to follow this
-
- caution will result in a total loss of function of COM3 (COM4).
-
- In addition, the ports should be opened in descending order of
-
- the planned baud rate, i.e. the faster port should be opened
-
- first, the slower port should be opened last. Whenever possible
-
- or practical, you will obtain best results by using the same baud
-
- rate on both ports.
-
-
-
- One final caution is in order. One or two users have attempted
-
- to trace through the interrupts as they occur using software
-
- based debuggers. This is a risky proposition at best since most
-
- debuggers work by tapping into, and disturbing, the interrupt
-
- mechanism. If you feel you must use a debugger, try to avoid the
-
- kernel routines of LiteComm, or use a hardware-based debugger
-
- such as Periscope.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 14
-
-
-
-
-
- INSTALLATION
-
-
-
- PACKAGE CONTENTS
-
- Your distribution diskette contains many files that are important
-
- to you. See the file PACKING.LST on the distribution disk for a
-
- list of the files that you should have received.
-
-
- INSTALLING LITECOMM
-
- LiteComm is installed with the INSTALL utility that we provide on
-
- the distribution diskette. To use this utility, follow the easy
-
- steps below:
-
-
-
- 1. Make a copy of the distribution diskette before beginning.
-
- 2. Insert the distribution diskette in your diskette drive.
-
- 3. Make the distribution diskette the default drive by typing ei-
-
- ther A:<ENTER> or B:<ENTER>.
-
- 4. Type the command
-
-
- INSTALL<ENTER>.
-
-
- INSTALL will present you with a screen that specifies the in-
-
- stallation default values. You may freely edit them before pro-
-
- ceeding with the installation. Use the arrow keys to move between
-
- the various options. When you are satisfied with your responses,
-
- press the <PAGE-DOWN> key to proceed with installation.
-
-
-
- INSTALL will create several directories on the target disk drive.
-
- These directories do not have to exist before you start INSTALL.
-
- After copying the necessary files, INSTALL will decompress the
-
- files into their final form and clean up after itself.
-
- By default, install will create the following directories:
-
- LITECOMM Header Files
-
-
- LITECOMM\LIB PreBuilt Libraries
-
- LITECOMM\SOURCE Package Source Code
-
-
-
- If you prefer, of course, you may install LiteComm manually by
-
- copying all of the distributed EXE files to your destination
-
- disk. Then execute each to decompress it, with the exception of
-
- INSTALL. Finally, delete each of the EXE files to clean up your
-
- disk. They will no longer be needed.
-
- REBUILDING THE LIBRARIES
-
- We have provided you with the source code for LiteComm so that
-
- you may modify our product to meet special needs. We encourage
-
- you to use the provided MAKE files to accomplish this. They were
-
- used in constructing the libraries you have just installed and
-
- will make the task decidedly simpler. the make files for Turbo C
-
- are TURBOCOMM.MAK and TLCP.MAK. The make files for Microsoft C
-
- are MSCCOMM.MAK and MLCP.MAK.
-
-
-
-
-
- 15
-
-
-
-
-
- We have had a report from one user that the make files are not
-
- compatible with the version of the make utility provided with the
-
- IBM C compiler, even though IBM's product is derived from Micro-
-
- soft C. Unfortunately, we do not support the IBM product as we
-
- have no way of assuring compatibility. We do understand, however,
-
- that the Microsoft libraries are fully compatible.
-
- GENERAL NOTES
-
- LiteComm and its related libraries make extensive use of parame-
-
- ters defined in the included header files. Your programs should
-
- always use the same header file parameters. While every effort
-
- will be made in future releases of LiteComm to preserve the val-
-
- ues as currently provided, we cannot guarantee that changes will
-
- never occur. The surest way to safeguard your efforts is to use
-
- the defined parameters. Then, when new versions of LiteComm are
-
- released, you need only recompile and relink to insure
-
- consistency.
-
-
-
- In the discussion of the various functions that follows, you
-
- should assume that any references to the port variable refer to a
-
- variable or constant that may take on a value of from 1 to 4. No
-
- other values are acceptable, and will be rejected.
-
-
- While we feel that LiteComm is written in the most efficient way
-
- possible, commensurate with good programming practice, we cannot
-
- be responsible for variations caused by hardware configurations
-
- or other factors beyond our control. LiteComm has been tested on
-
- the IBM PC-AT, IBM PS/2 and several compatible systems such as
-
- the Zenith and Wyse equivalents. LiteComm has not been tested in
-
- environments in which other software, most significantly TSR
-
- (terminate and stay resident) modules exist. Some TSR programs
-
- that "steal" interrupts for their purposes present an unfavorable
-
- environment to other programs that rely on the interrupt struc-
-
- ture of the computer.
-
-
-
- If you experience erratic behavior with LiteComm in a TSR-type
-
- situation, try executing your application without the TSR module
-
- being present. If the problems you have experienced disappear,
-
- suspect the TSR module.
-
-
- Conversely, LiteComm provides an excellent vehicle for supporting
-
- TSR programs that you may write. Since the package is fully
-
- reentrant, your only concern need be with those aspects of TSR
-
- programs are of normal concern, e.g., the non reentrant nature of
-
- DOS.
-
- LiteComm only uses DOS functions when opening and closing ports.
-
- It may therefore be safely used in a TSR environment. As an
-
- example, we have included the program SPM as part of this re-
-
- lease. SPM is a background Serial Port Monitor that is available
-
- as a separate shareware product. SPM was developed using Lite-
-
- Comm.
-
-
- USE WITH MULTITASKING ENVIRONMENTS
-
- Some users have made attempts at using LiteComm with multitasking
-
- environments such as Quarterdesk's DesqView. Use of LiteComm in
-
-
- 16
-
-
-
-
-
- such an environment is certain to be affected by the way in which
-
- the multitasking behaves with respect to interrupts. We recog-
-
- nize that DesqView has achieved a great deal of popularity among
-
- so-called power users. Still, LiteComm was not explicitly de-
-
- signed for such environments, and its performance may suffer as a
-
- result.
-
- NOTES ON RING DETECTION
-
- Several users have reported problems in consistently detecting a
-
- ringing telephone by checking the state of the RI (Ring Indica-
-
- tor) signal. The problem seems highly dependent on the type of
-
- modem that is being used, since this signal comes from the modem.
-
- If the duration of the signal is too short, the program may miss
-
- the signal as the modem toggles it. One workaround that has been
-
- successfully is to check the RICHG bit returned from lc_mstat,
-
- rather than the RI bit. The RICHG bit will be set when the RI
-
- bit comes one and again when the RI bit goes off. This is the
-
- method employed in the check_for_call function.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 17
-
-
-
-
-
- FUNCTION REFERENCE
-
-
-
- GENERAL INFORMATION
-
- In the following pages, we provide the detailed information about
-
- each available LiteComm ToolBox function. Each function defini-
-
- tion includes, at a minimum, a summary of how to code the func-
-
- tion, a description of what the function does, and an indication
-
- of those values, if any, that the function might return.
-
-
-
- Where appropriate, we include additional documentation about the
-
- function. Some definitions include examples, in the sense of
-
- code fragments illustrating the function's usage. More impor-
-
- tantly, some definitions include additional notes and warnings as
-
- well as references to other functions within the package.
-
-
- We have made every effort to insure that the documentation of the
-
- functions is complete and accurate. The style and manner of the
-
- documentation assume that the reader is thoroughly familiar with
-
- the elements of C syntax and common conventions.
-
-
-
- FLOW CONTROL
-
- In version 6 of LiteComm, we have incorporated fully automatic
-
- flow control, using either software, sometimes called XON-XOFF
-
- control, or hardware using the handshaking signals.
-
- Note:
- Note:
- Note:It is not valid to have both methods of flow control active
-
- at the same time. Failure to observe this restriction can cause
-
- unpredictable results.
-
- GLOBAL ERROR VARIABLE
-
-
- Version 6 of LiteComm has a global error variable that is set by
-
- each of the LiteComm functions. The variable, _lc_error
- _lc_error
- _lc_error, is de-
-
- fined in LITECOMM.H. Possible values are in the file LITE-
-
- COMM.ERR. Examining the contents of _lc_error can help you
-
- diagnose and correct problems.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 18
-
-
-
-
-
- _portchg
-
-
-
- SUMMARY
-
- #include <litecomm.h>
-
-
- int _portchg(port, base, irq, vector)
-
- unsigned port;
-
- unsigned base;
-
- unsigned vector;
-
-
- char irq;
-
- DESCRIPTION
-
- Changes one or more of the critical parameters for COM3 or COM4.
-
- This function must be used before the opening port to be effec-
-
- tive. To leave any of the parameters at its default value, make
-
- the corresponding entry 0. Note that vector is a vector number,
-
- not an address or pointer.
-
- The irq parameter is NOT the irq (interrupt request) number, but
-
- the irq mask. The following lines, reproduced from 'litecomm.h'
-
- help illustrate this idea.
-
-
- #define IRQ1 0x10 /* int req mask for port 1 - irq4 */
-
- #define IRQ2 0x08 /* int req mask for port 2 - irq3 */
-
- Note:
- Note:
- Note:The value for irq4 is NOT 4, but a character in which bit 4,
-
- using INTEL's bit numbering, has a value of 1. Thus, to use irq
-
- priority 1 as the irq for either COM3 or COM4, you would specify
-
- 0x02 as the value of irq when calling _portchg.
-
- The default parameters are in the litecomm.h include file.
-
-
- If you intend to change the default irq settings, you also MUST
- MUST
- MUST
-
- make a corresponding change to the vector number. See the accom-
-
- panying documentation about using COM3 and COM4 for additional
-
- details. Failure to follow this rule may make the port appear to
-
- be nonfunctional.
-
- The _portchg function does NOT check to determine that you have
-
- provided both an IRQ mask AND a new vector number.
-
-
- Example
- Example
- Example
-
-
-
- if (_portchg(port, 0x408, 0, 0, 0) == -1)
-
- {
-
- printf("Error Changing Port %d\n", port);
-
- exit(1);
-
- }
-
-
-
- RETURN VALUES
-
- Returns 0 if the function is successful, -1 if you attempt to
-
- change a port other that 3 or 4.
-
-
-
-
-
-
-
- 19
-
-
-
-
-
- comm_opn
-
-
-
- SUMMARY
-
- #include <litecomm.h>
-
-
- int comm_opn(port, baud, parity, datab, stopb, inbufsz, outbufsz,
-
- raisemdm)
-
- unsigned port;
-
- unsigned baud;
-
- unsigned parity;
-
-
- unsigned datab;
-
- unsigned stopb;
-
- unsigned inbufsz;
-
- unsigned outbufsz;
-
-
- DESCRIPTION
-
- Opens the specified port for use and attaches an interrupt han-
-
- dler to DOS for the port. Optionally, comm_opn will raise the DTR
-
- and RTS modem control signals, if the value of raisemdm is TRUE.
-
- The function allocates, from the heap, space for the CCB (com-
-
- munications control block), space for the interrupt handler's
-
- stack, and buffers for input and output of the specified sizes.
-
- The minimum value for inbufsz is 128; the minimum size for out-
-
- bufsz is 64.
-
- If sufficient memory is available and the parameters are correct,
-
- the port will be set to the parameters (baud rate, word length,
-
- stop bits) used when the function is called. The memory overhead
-
- associated with opening a port can be approximated by adding
-
- about 1.2K bytes to the buffer sizes specified.
-
- comm_opn installs an exit handler using the atexit() function to
-
- protect DOS from problems that might arise if a program using
-
- LiteComm fails. Still, it is sound practice to close a port
-
- opened in this manner using comm_close explicitly in your program
-
- to gain maximum control over the port.
-
-
- The baud parameter is an unsigned integer that specifies the baud
-
- rate you intend to use, e.g., 4800. The other parameters passed
-
- to the function should be from the parameter set in the lite-
-
- comm.h include file.
-
-
-
- Example
- Example
- Example
-
-
- Below are two examples of using comm_opn, the first letting
-
- comm_opn raise the modem control signals, the second using two
-
- function calls to do the same thing. The result of each example
-
- is the same, an open port on which the DTR and RTS signals have
-
- been raised.
-
- Example 1
- Example 1
- Example 1
-
- if (comm_opn(port, 1200, NPARITY, BIT8, STOP1, 256,
-
- 256, TRUE) == - 1)
-
- {
-
- printf("Error Opening Port %d\n", port);
-
- exit(1);
-
-
- 20
-
-
-
-
-
- }
-
- Example 2
- Example 2
- Example 2
-
- if (comm_opn(port, 1200, NPARITY, BIT8, STOP1, 256,
-
- 256, FALSE) == - 1)
-
- {
-
-
- printf("Error Opening Port %d\n", port);
-
- exit(1);
-
- }
-
- lc_setmdm(port, (DTR | RTS));
-
-
-
- RETURN VALUES
-
- Upon successful open, the function returns port. If any error
-
- occurs, despite the type, the function returns -1.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 21
-
-
-
-
-
- comm_close
-
-
-
- SUMMARY
-
- #include <litecomm.h>
-
-
- int comm_close(port, dropmdm)
-
- unsigned port;
-
- DESCRIPTION
-
- This function is the companion to comm_opn and, in effect, per-
-
- forms the opposite action. Comm_close detaches the library rou-
-
- tines from the interrupt handler, and reconnects the previous
-
- interrupt handler.
-
-
- Comm_close also releases all allocated memory used for the buff-
-
- ering and control structures described under comm_opn. If the
-
- value of dropmdm is non-zero, the port is closed absolutely, and
-
- all modem control signals are dropped. If the value of dropmdm
-
- is zero, the port is closed conditionally, and both the DTR and
-
- RTS signals will be left in their current state.
-
- Since comm_opn installs an exit handler using the atexit function
-
- in both Turbo C and Microsoft C, you are not required to close
-
- explicitly an open port. However, if you do not explictly close
-
- the port, you will lose control over the handling of the DTR and
-
- RTS signals since the built-in exit handler uses the absolute
-
- form of the close.
-
-
- Example
- Example
- Example
-
-
- These are two equivalent examples of the comm_close function.
-
- The first uses the absolute port close, the second uses two
-
- function calls to do the same thing.
-
- Example 1
- Example 1
- Example 1
-
- comm_close(port, TRUE); /* absolute close */
-
- Example 2
- Example 2
- Example 2
-
- lc_clrmdm(port, (RTS | DTR)); /* lower modem control */
-
- comm_close(port, FALSE); /* conditional close */
-
-
- RETURN VALUES
-
- If any error occurs, despite the type, the function returns -1.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 22
-
-
-
-
-
- comm_setup
-
-
-
- SUMMARY
-
- #include <litecomm.h>
-
-
- int comm_setup(port,baud,parity,datab,stopb)
-
- unsigned port;
-
- unsigned baud;
-
- unsigned parity;
-
-
- unsigned datab;
-
- unsigned stopb;
-
- DESCRIPTION
-
- The comm_setup function is a subset of the comm_opn function and
-
- the remarks made in the description of comm_opn regarding the
-
- port parameters apply.
-
-
- This function is useful if you wish to change the basic commu-
-
- nication parameters of the specified port that has already been
-
- opened without comm_close'ing the port.
-
-
-
- Example
- Example
- Example
-
-
- if (comm_setup(port, 1200, NPARITY, BIT8, STOP1) ==
-
- -1)
-
- {
-
- printf("Error Changing Port %d\n", port);
-
- exit(1);
-
- }
-
-
-
- RETURN VALUES
-
- If any error occurs, despite the type, the function returns -1.
-
- SEE ALSO
-
-
- comm_opn
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 23
-
-
-
-
-
- lc_vport
-
-
-
- SUMMARY
-
- #include <litecomm.h>
-
-
- COMM *lc_vport(port)
-
- DESCRIPTION
-
- lc_vport is a macro that validates that the port number specified
-
- is correct and has been opened with the comm_opn function. It may
-
- be of use to you in writing certain applications.
-
-
- RETURN VALUES
-
- If the port is valid and has been opened, returns a pointer to
-
- the CCB (communications control block) for the port. Returns NULL
-
- if an error occurs;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 24
-
-
-
-
-
- lc_icnt, lc_ocnt
-
-
-
- SUMMARY
-
- #include <litecomm.h>
-
-
- int lc_icnt(port)
-
- int lc_ocnt(port)
-
- unsigned port;
-
- DESCRIPTION
-
-
- These functions may be used to determine the number of characters
-
- currently in the input(lc_icnt) or output(lc_ocnt) buffers for
-
- the port.
-
-
-
- Example
- Example
- Example
-
-
- #include <litecomm.h>
-
- if (lc_icnt(port)) /* anything received ? */
-
- puts("Characters waiting in input");
-
-
-
- RETURN VALUES
-
- Both functions return -1 if an error occurs (port not open or
-
- invalid port number). The lc_icnt() function returns the number
-
- of characters in the input buffer; lc_ocnt() returns the number
-
- of characters remaining in the transmit buffer.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 25
-
-
-
-
-
- lc_mstat
-
-
-
- SUMMARY
-
- #include <litecomm.h>
-
-
- int lc_mstat(port)
-
- unsigned port;
-
- DESCRIPTION
-
- May be used to determine the last known state of the modem-
-
- supplied handshake signals. These may be tested using the values
-
- in the include file litecomm.h.
-
-
- The handshake signals consist of a byte in which the bits 4-7
-
- contain the current state of the signals (such as Clear To Send
-
- or CTS). Bits 0-3 contain information regarding whether
-
- individual signals have changed. lc_mstat always returns the
-
- current values of the signals in bits 4-7. Bits 0-3 will reflect
-
- which, if any, of the signals has changed.
-
- The easiest approach to dealing with the returned value is to
-
- test bits 0-3 (the DELTA or change bits) for a non-zero value.
-
- If any non-zero value is found in bits 0-3, one or more signals
-
- have changed _____ ___ ____ ____ __ ________
- since the last call to lc_mstat.
-
- Note:
- Note:
- Note:The functions resets the DELTA bits. The value obtained
-
- from bits 4- 7 will correctly reflect the current state of the
-
- signals.
-
- To examine individual signals, litecomm.h has #defined symbols
-
- for the change bits ,e.g., CTSCHG, and for the signals themselves
-
- ,e.g.. CTS.
-
-
-
-
- Example
- Example
- Example
-
- int curstat;
-
-
- curstat = lc_mstat(port);
- /* get curent values */
-
-
- if (curstat & DCDCHG) /* DCD changed ? */
-
- if (! (curstat & DCD))
-
- /* carrier still on */
-
- puts("Remote is off-line, carrier lost");
-
-
-
- RETURN VALUES
-
- If the port is valid and open, returns the current modem status
-
- bits. Returns -1 if an error occurs.
-
- SEE ALSO
-
- lc_got???
-
-
-
-
-
-
-
-
-
-
- 26
-
-
-
-
-
- lc_got???
-
-
-
- SUMMARY
-
- #include "litecomm.h"
-
-
- unsigned port;
-
- lc_gotcts(port);
-
- lc_gotdsr(port);
-
- lc_gotri(port);
-
-
- lc_gotdcd(port);
-
- lc_gotctschg(port);
-
- lc_gotdsrchg(port);
-
- lc_gotrichg(port);
-
-
- lc_gotdcdchg(port);
-
-
- DESCRIPTION
-
- This set of 8 macros makes the job of testing the individual mo-
-
- dem status signals simpler.
-
-
- The macros rely upon the lc_mstat function and you should refer
-
- to the description of that function for additional information.
-
- SEE ALSO
-
- lc_mstat
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 27
-
-
-
-
-
- lc_estat
-
-
-
- SUMMARY
-
- #include <litecomm.h>
-
-
- int lc_estat(port)
-
- unsigned port;
-
- DESCRIPTION
-
- May be used to determine the last known state of the serial
-
- port's error status bits. These may be tested using the values in
-
- the include file litecomm.h.
-
-
- The errors that are detected and reported include:
-
- ORUNERR - failure to fetch a character from the port before the
-
- next character arrived. Usually a problem in the interrupt han-
-
- dler.
-
- PARERR - One or more characters were received in which the parity
-
- of the character(s) did not match the current parity setting of
-
- the port. Can be caused by line noise, or by other causes.
-
- FRMERR - A framing error has occurred. A character arrived that
-
- had too few or (more likely) too many bits. Usually caused by
-
- line noise.
-
-
- RETURN VALUES
-
- If the port is valid and open, returns the current error status
-
- bits. Returns -1 if an error occurs.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 28
-
-
-
-
-
- lc_getw
-
-
-
- SUMMARY
-
- #include <litecomm.h>
-
-
- int lc_getw(port)
-
- unsigned port;
-
- DESCRIPTION
-
- Reads a character from the serial port's input buffer. Waits in-
-
- definitely until a character is available. If the port is dis-
-
- connected for any reason, this function will cause a system hang
-
- if called, so its use should be carefully controlled.
-
-
- RETURN VALUES
-
- Returns the next available character in the input buffer for the
-
- port. Returns -1 if the port is not active, or if an invalid port
-
- number is specified.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 29
-
-
-
-
-
- lc_setmdm
-
-
-
- SUMMARY
-
- #include <litecomm.h>
-
-
- int lc_setmdm(port, newset)
-
- unsigned port;
-
- unsigned newset;
-
- DESCRIPTION
-
-
- Set one or more of the modem control signals. Because of the need
-
- to have OUT2 set for interrupt support, the function always pro-
-
- vides the correct setting for this bit. Use the symbolic #defines
-
- found in the litecomm.h file. Many applications will not require
-
- this function, if they allow comm_opn to raise these two signals.
-
- More sophisticated applications may be required to control either
-
- or both of the signals to provide handshaking with an external
-
- device.
-
-
-
- Example
- Example
- Example
-
-
- /* raise the RTS modem control signal */
-
- lc_setmdm(port, RTS);
-
- /* raise both RTS and DTR */
-
- lc_setmdm(port, (RTS | DTR));
-
-
-
- RETURN VALUES
-
- Returns 0 if the operation was successful, returns -1 otherwise.
-
- SEE ALSO
-
- comm_opn, lc_clrmdm, lc_togmdm, lc_setdtr, lc_setrts
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 30
-
-
-
-
-
- lc_setdtr, lc_setrts
-
-
-
-
- SUMMARY
-
-
- #include "litecomm.h"
-
- unsigned port;
-
- lc_setdtr(port);
-
- lc_setrts(port);
-
-
- DESCRIPTION
-
- lc_setdtr and lc_setrts are macros designed to help make your
-
- code more explicit. Both macros use the lc_setmdm function to set
-
- the DTR and RTS signals. Note that no effort is made to preserve
-
- the current modem signal status. That is use of the lc_setdtr
-
- macro will cause RTS to drop. The converse is true of lc_setrts.
-
- SEE ALSO
-
- lc_setmdm
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 31
-
-
-
-
-
- lc_clrmdm
-
-
-
- SUMMARY
-
- #include <litecomm.h>
-
-
- int lc_clrmdm(port, newset)
-
- unsigned port;
-
- unsigned newset;
-
- DESCRIPTION
-
-
- Companion to the setmdm function. Clears the modem control sig-
-
- nals RTS or DTR or both. Because of the need to have OUT2 set for
-
- interrupt support, the function always provides the correct set-
-
- ting for this bit. Use the symbolic #defines found in the lite-
-
- comm.h file. Generally, this function only has value if you
-
- trying to implement some form of hardware handshaking with
-
- another device. The comm_close function will lower both RTS and
-
- DTS automatically, if told to do so.
-
-
- Example
- Example
- Example
-
- /* lower the RTS modem control signal */
-
- lc_clrmdm(port, RTS);
-
-
- /* lower both RTS and DTR */
-
- lc_clrmdm(port, (RTS | DTR));
-
-
- RETURN VALUES
-
-
- Returns 0 if the operation was successful, returns -1 otherwise.
-
- SEE ALSO
-
- comm_close, lc_setmdm, lc_togmdm
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 32
-
-
-
-
-
- lc_togmdm
-
-
-
- SUMMARY
-
- #include <litecomm.h>
-
-
- int lc_togmdm(port, newset)
-
- unsigned port;
-
- unsigned newset;
-
- DESCRIPTION
-
-
- Companion to setmdm function. Inverts (flip-flops) the modem
-
- control signals RTS or DTR or both. Because of the need to have
-
- OUT2 set for interrupt support, the function always provides the
-
- correct setting for this bit. Use the symbolic #defines found in
-
- the litecomm.h file. This function may have value if you are
-
- trying to implement hardware handshaking.
-
-
- Example
- Example
- Example
-
- /*
-
- ** change the RTS modem control signal to its other
-
-
- ** state (e.g. if raised, lower, and if lowered, raise
-
- */
-
- lc_togmdm(port, RTS);
-
-
-
- RETURN VALUES
-
- Returns 0 if the operation was successful, returns -1 otherwise.
-
- SEE ALSO
-
- lc_setmdm, lc_clrmdm
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 33
-
-
-
-
-
- lc_xoff
-
-
-
- SUMMARY
-
- #include <litecomm.h>
-
-
- int lc_xoff(port, flag)
-
- unsigned port;
-
- int flag;
-
- DESCRIPTION
-
-
- If flag is non-zero, the function enables automatic software flow
-
- control function. If flag is zero (the default setting),
-
- automatic flow control is disabled.
-
-
- When enabled, the LiteComm kernel will automatically transmit the
-
- OFF character when the input buffer is approximately 2/3 full and
-
- will automatically recognize an OFF character sent by the other
-
- device. If the other device transmits an OFF character, the ker-
-
- nel will refuse to send any characters until the condition is
-
- cleared by receipt of the ON character or by disabling software
-
- flow control altogether.
-
- The recognition functionality is implimented in the kernel. As a
-
- result, the transmit buffer will continue to accept input from
-
- your program until the buffer fills completely, even though the
-
- information will not be sent. Once the matching ON character is
-
- received, the contents of the transmit buffer will be sent
-
- rapidly to the other device. It is possible that the rate with
-
- which characters are sent when this occurs may cause problems for
-
- the other device, depending on its ability to handle the data
-
- flow.
-
-
- If you intended to implement a protocol that might include the ON
-
- or OFF characters, be sure to disable the automatic flow control.
-
- Failure to do so may result in a system hang.
-
-
- By default, software flow control uses the XON-XOFF flow control
-
- characters. You may change the characters to suit your applica-
-
- tion by using the lc_setxon and lc_setxoff functions.
-
- RETURN VALUES
-
-
- Returns 0 if the operation was successful, returns -1 otherwise.
-
- SEE ALSO
-
- lc_gotxoff, lc_putxoff, lc_setxon, lc_setxoff
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 34
-
-
-
-
-
- lc_gotxoff
-
-
-
- SUMMARY
-
- #include <litecomm.h>
-
-
- int lc_gotxoff(port)
-
- unsigned port;
-
- DESCRIPTION
-
- If the OFF character has been received, this function will return
-
- a non-zero value. A zero is returned if the OFF character is
-
- never received, or if the ON character is detected.
-
-
- Note:
- Note:
- Note:Unlike older versions of LiteComm, lc_gotxoff is now useful
-
- only for information. It does not alter the way in which software
-
- flow control operates.
-
- RETURN VALUES
-
- Returns a nonzero value if the OFF character was detected, zero
-
- if an OFF character was not detected, or if the ON character is
-
- detected. Will return -1 in the case of an error.
-
-
- SEE ALSO
-
- lc_xoff, lc_putxoff, lc_setxon, lc_setxoff
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 35
-
-
-
-
-
- lc_putxoff
-
-
-
- SUMMARY
-
- #include <litecomm.h>
-
-
- int lc_putxoff(port)
-
- unsigned port;
-
- DESCRIPTION
-
- See below for the values returned. If the LiteComm kernel has
-
- sent the OFF character.
-
-
- Note:
- Note:
- Note:Unlike older versions of LiteComm, this function provides
-
- information only. Use of the function has no effect upon software
-
- flow control.
-
- RETURN VALUES
-
- Returns a nonzero value if an OFF character was sent to the other
-
- device, zero if an OFF was not sent, or if the ON character has
-
- been sent. Will return -1 in the case of an error.
-
-
- SEE ALSO
-
- lc_xoff, lc_putxoff, lc_setxon, lc_setxoff
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 36
-
-
-
-
-
- lc_setxon, lc_setxoff
-
-
-
- SUMMARY
-
- #include "litecomm.h"
-
-
- int lc_setxon(port, xonchar);
-
- int lc_setxoff(port, xoffchar);
-
- unsigned port;
-
- unsigned char xonchar;
-
-
- unsigned char xoff char;
-
- DESCRIPTION
-
- These functions are part of the software flow control functonal-
-
- ity of LiteComm. By default, LiteComm's software flow control
-
- uses the XON-XOFF character scheme. If your application has dif-
-
- ferent requirements, use the lc_setxon function to change the ON
-
- character, lc_setxoff to set the OFF character.
-
- RETURN VALUES
-
-
- Both functions return a -1 if an error occurs. Both return a
-
- value of zero (0) if there is no error.
-
- SEE ALSO
-
- lc_xoff, lc_gotxoff, lc_putxoff
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 37
-
-
-
-
-
- lc_sethwflow
-
-
-
- SUMMARY
-
- #include "litecomm.h"
-
-
- int lc_sethwflow(port, flowtype)
-
- unsigned port;
-
- unsigned char flowtype;
-
- DESCRIPTION
-
-
- This function specifies the type of hardware flow control to use
-
- and activates hardware flow control. The point at which hardware
-
- flow control is activated is the same as for software flow con-
-
- trol.
-
-
- You have complete control over which hardware signals are used
-
- for flow control. For output (from the port) control specify ei-
-
- ther USEDSR or USECTS. For input (to the port) control, specify
-
- either USEDTR or USERTS. Since most hardware flow control schemes
-
- employ both input and output flow control, you should OR the re-
-
- quired values together, as shown in the example. Hardware flow
-
- control remains in effect until you issue the lc_clearhwflow
-
- function.
-
-
-
- Note:
- Note:
- Note:The flow control scheme assumes that the input flow control
-
- signal (RTS or DTR) have been set to the correct starting value
-
- by the program. Thereafter, LiteComm flow control will manage the
-
- signals.
-
-
-
- Example
- Example
- Example
-
-
- /* Use RTS-CTS flow control */
-
- if lc_sethwflow(port, (USECTS | USERTS))
-
- puts("Error setting flow control");
-
-
-
- RETURN VALUES
-
- The function returns a value of zero (0) if successful. If an
-
- error occurs, the function returns -1.
-
- SEE ALSO
-
- lc_xoff, lc_clearhwflow, lc_puthwstop, lc_gothwstop
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 38
-
-
-
-
-
- lc_clearhwflow
-
-
-
- SUMMARY
-
- #include "litecomm.h"
-
-
- int lc_clearhwflow(port)
-
- unsigned port;
-
- DESCRIPTION
-
- Immediately deactivates hardware flow control. Any untransmitted
-
- characters will be sent as rapidly as possible.
-
-
- RETURN VALUES
-
- If successful, returns a value of zero (0). Retuirns -1 if an
-
- error occurs.
-
- SEE ALSO
-
-
- lc_sethwflow, lc_puthwstop, lc_gothwstop
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 39
-
-
-
-
-
- lc_puthwstop
-
-
-
- SUMMARY
-
- #include "litecomm.h"
-
-
- int lc_puthwstop(port)
-
- unsigned port;
-
- DESCRIPTION
-
- Indicates whether or not LiteComm has instructed the remote de-
-
- vice to stop transmitting.
-
-
- RETURN VALUES
-
- If an error occurs, returns a value of -1. If input flow control
-
- has not been asserted, returns a value of zero (0). If input flow
-
- control has been asserted, returns a positive, non-zero value;
-
- SEE ALSO
-
-
- lc_sethwflow, lc_gothwflow
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 40
-
-
-
-
-
- lc_gothwstop
-
-
-
- SUMMARY
-
- #include "litecomm.h"
-
-
- int lc_gothwstop(port)
-
- unsigned port;
-
- DESCRIPTION
-
- Indicates whether or not LiteComm has been instructed by the re-
-
- mote device to stop transmitting.
-
-
- RETURN VALUES
-
- If an error occurs, returns a value of -1. If output flow control
-
- has not been asserted, returns a value of zero (0). If output
-
- flow control has been asserted by the remote device, returns a
-
- positive, non-zero value;
-
- SEE ALSO
-
-
- lc_sethwflow, lc_puthwflow
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 41
-
-
-
-
-
- lc_get
-
-
-
- SUMMARY
-
- #include <litecomm.h>
-
-
- int lc_get(port)
-
- unsigned port;
-
- DESCRIPTION
-
- Read a character from the serial port's input buffer. Discard
-
- (ignore) the matching status value
-
-
-
-
- Example
- Example
- Example
-
- if ((ch = lc_get(port)) != -1)
-
- /* any chars? */
-
- ch &= 0x7f; /* mask parity */
-
-
-
- RETURN VALUES
-
- Returns the next available character in the input buffer for the
-
- port. If you specified other than NO PARITY when you opened the
-
- port, you may have to mask (make zero) the parity bit before you
-
- use the character. Returns -1 if the port is not active, or if
-
- there are not characters in the port's buffer.
-
-
- SEE ALSO
-
- lc_getstat, wait, purge
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 42
-
-
-
-
-
- lc_getstat
-
-
-
- SUMMARY
-
- #include "litecomm.h"
-
-
- int lc_getstat(port, ch, status);
-
- unsigned port;
-
- unsigned char *ch;
-
- unsigned char *status;
-
-
- DESCRIPTION
-
- This function retrieves the next character and its corresponding
-
- error status from the LiteComm buffers, if there are characters
-
- available. The status that is returned is the value of the error
-
- status register at the time the character was received. For more
-
- information about the error status see the lc_estat function.
-
- Note:
- Note:
- Note:The variables for ch and status must both be pointers.
-
-
- RETURN VALUES
-
- If there are characters available and no other errors occur, the
-
- function will return a value of zero (0). If there are no other
-
- characters, or if some other error occurs, the function returns a
-
- value of -1.
-
- SEE ALSO
-
- lc_get, lc_estat, wait, purge
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 43
-
-
-
-
-
- wait
-
-
-
- SUMMARY
-
- #include "litecomm.h"
-
-
- int wait(port, secs, sig_to_check);
-
- unsigned port;
-
- int secs;
-
- unsigned char sig_to_check;
-
-
- DESCRIPTION
-
- The wait function waits for secs seconds for input from the des-
-
- ignated port before returning. Optionally, wait will also monitor
-
- one or more of the modem status signals and return if the signal
-
- drops.
-
-
- Secs must be greater than zero. If you do not want wait to moni-
-
- tor a modem status signal, specify zero (0) as sig_to_check. To
-
- specify a signal, use the constants, such as DCD, found in lite-
-
- comm.h.
-
-
-
- Note:
- Note:
- Note:Valid signal values are CTS, DCD, DSR, and RI.
-
- RETURN VALUES
-
- If a character is retrieved within the time allowed, the function
-
- returns the character. If a character is not available in the
-
- specified time, if the specified signal is lost, or if some other
-
- error occurs, the function returns a value of -1.
-
-
- SEE ALSO
-
- lc_get, lc_getstat
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 44
-
-
-
-
-
- purge
-
-
-
- SUMMARY
-
- #include "litecomm.h";
-
-
- void purge(port);
-
- unsigned port;
-
- DESCRIPTION
-
- The purge function discards any characters received until there
-
- are no more incoming characters for a period of 1 second.
-
-
- RETURN VALUES
-
- This function does not return any value;
-
- SEE ALSO
-
-
- wait
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 45
-
-
-
-
-
- lc_peek
-
-
-
- SUMMARY
-
- #include <litecomm.h>
-
-
- int lc_peek(port)
-
- unsigned port;
-
- DESCRIPTION
-
- Look at the next character in the serial port's input buffer. Do
-
- not remove the character from the buffer.
-
-
- RETURN VALUES
-
- Returns the next available character in the input buffer for the
-
- port, but does not remove the character from the buffer. This
-
- allows the application to look-ahead by one character in a
-
- nondestructive fashion. See additional comments under lc_get re-
-
- garding parity. Returns -1 if the port is not active, or if there
-
- are no characters in the port's buffer.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 46
-
-
-
-
-
- lc_put
-
-
-
- SUMMARY
-
- #include <litecomm.h>
-
-
- int lc_put(port,ch)
-
- unsigned port;
-
- char ch;
-
- DESCRIPTION
-
-
- Place a character into the serial port's output buffer.
-
- RETURN VALUES
-
- Returns 0 if successful. Note that this does not guarantee that
-
- the character has been sent, only that no errors were detected,
-
- and that there was room in the transmit buffer for the character.
-
- Characters are sent from the transmit buffer when the system has
-
- time to send them, assuming all conditions for transmission are
-
- satisified. Returns -1 if the port is not active, or if there no
-
- room in the port's buffer.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 47
-
-
-
-
-
- lc_gets
-
-
-
- SUMMARY
-
- #include <litecomm.h>
-
-
- int lc_gets(port, buff, cnt)
-
- unsigned port;
-
- char *buff;
-
- int cnt;
-
-
- DESCRIPTION
-
- Read a stream of, at most, cnt characters from the serial port's
-
- input buffer into the buff location. Ignore and discard any sta-
-
- tus information. This function is not sensitive to the NULL
-
- character. See lc_get for additional information.
-
-
-
-
- Example
- Example
- Example
-
- char * j;
-
- int k;
-
- int wrk;
-
-
- j = buff; /* point to top of our buffer */
-
-
- k = sizeof(buff); /* set chars needed to fill */
-
- do
-
- {
-
- wrk = lc_gets(port, j, k);
-
- if (wrk != -1) /* got something ? */
-
- {
-
- j += wrk; /* bump buffer pointer */
-
- k -= wrk; /* decrement chars req'd */
-
-
- }
-
- } until (k <= 0);
-
-
- RETURN VALUES
-
-
- Returns the count of characters transferred into buffer, or -1 if
-
- an error occurs.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 48
-
-
-
-
-
- lc_puts
-
-
-
- SUMMARY
-
- #include <litecomm.h>
-
-
- int lc_puts(port, buff, cnt)
-
- unsigned port;
-
- char *buff;
-
- int cnt;
-
-
- DESCRIPTION
-
- Place a stream of, at most,
-
- cnt characters into the serial port's
-
- output buffer. Any required parity will be supplied by the serial
-
- port itself.
-
-
-
-
- Example
- Example
- Example
-
- char * j
-
- int j;
-
- int sent;
-
- j = buff;
-
- k = sizeof(buff)
-
-
- do
-
- {
-
- sent = lc_puts(port, j, k);
-
- if (sent > 0)
-
- {
-
- j += sent;
-
- k -= sent;
-
- }
-
-
- } until (k <= 0);
-
-
- RETURN VALUES
-
-
- Returns the number of characters placed into the buffer. Note
-
- that this does not guarantee that the characters have been sent.
-
- The number of characters transferred into the output buffer may
-
- be less than the actual request. Returns 0 if any error occurs,
-
- or if there is no room in the port's buffer.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 49
-
-
-
-
-
- lc_flush
-
-
-
- SUMMARY
-
- #include <litecomm.h>
-
-
- int lc_tflush(port)
-
- int lc_rflush(port)
-
- int lc_flshtrue(port, ch)
-
- int lc_nflush(port, cnt)
-
-
- unsigned port;
-
- char ch;
-
- int cnt;
-
- DESCRIPTION
-
-
- The lc_?flush functions remove characters from the specified
-
- buffer and discard them; untransmitted characters in the transmit
-
- buffer are NEVER sent; unprocessed characters in the receive
-
- buffer are lost. Do not try to use the lc_tflush to force char-
-
- acters to be transmitted. The tflush function unconditionally
-
- empties the transmit buffer, discarding any unsent characters.
-
- lc_tflush empties the port's transmit buffer immediately.
-
- lc_rflush empties the port's receive and status buffers im-
-
- mediately.
-
-
- lc_flshtrue will continually dispose of received characters
-
- until the function finds the character ch. Use caution with
-
- this one since it does not detect port number errors, and may
-
- appear to seize the system.
-
- lc_nflush flushes, at most, cnt characters from the port's re-
-
- ceive and status buffers.
-
- RETURN VALUES
-
- lc_flshtrue returns no values. lc_tflush and lc_rflush return 0
-
- if successful and -1 if an error occurs. lc_nflush returns the
-
- number of characters flushed from the receive buffer or 0 when
-
- there are no characters to flush, or when an error occurs.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 50
-
-
-
-
-
- lc_sbrk
-
-
-
- SUMMARY
-
- #include <litecomm.h>
-
-
- int lc_sbrk(port)
-
- lc_gotbrk(port)
-
- unsigned port;
-
- DESCRIPTION
-
-
- lc_sbrk() generates a BREAK signal using a particular character-
-
- istic of the 8250 UART family to generate an accurate BREAK at
-
- any baud rate. BREAKs generated in this manner are timed based
-
- upon the baud rate at which the 8250 is currently initialized.
-
- This function may or may not work correctly with other than the
-
- actual 8250 UART or its relatives.
-
- RETURN VALUES
-
- lc_gotbrk returns a nonzero value if a break signal has been re-
-
- ceived on the specified port. It returns zero otherwise.
-
- lc_sbrk Returns 0 if successful. Returns -1 if the port is not
-
- active.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 51
-
-
-
-
-
- newtimer_s
-
-
-
- SUMMARY
-
- include "lctime.h";
-
-
- void newtimer_s(et, sec);
-
- EVENT *et;
-
- unsigned sec;
-
-
-
- int check_timer(et);
-
- EVENT ev;
-
- DESCRIPTION
-
- The newtimer_s function creates an 'event timer' that will expire
-
- in sec seconds. This function relies upon the calculation of an
-
- absolute time value and does not tie into any system interrupt,
-
- permitting as many independent timeout timers as required by your
-
- application.
-
-
- The check_timer function examines the contents of an event timer
-
- created by newtimer_s with respect to the current date and time,
-
- and indicates whether the timer has expired.
-
- Do not attempt to use check_timer against a variable that was not
-
- set by newtimer_s. If you do so, the results are unpredictable
-
- and may result in a seeming system hang.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 52
-
-
-
-
-
-
-
- Example
- Example
- Example
-
- EVENT cdtimer;
-
-
-
- newtimer_s(&cdtimer, 30); /* 30 second timer */
-
- while( ! check_timer(cdtimer))
-
- if (check_for_call(port) > 0)
-
- {
-
- cprintf("Incoming call\r\n");
-
- return(1);
-
-
- }
-
- cprintf("No calls in 30 seconds\r\n");
-
- return(0);
-
-
-
- RETURN VALUES
-
- The newtimer_s function returns no value but initializes a
-
- structure that represents a point in time sec seconds from the
-
- time that newtimer_s was called. The check_timer function returns
-
- a nonzero value if the specified event timer has expired, a value
-
- of zero otherwise.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 53
-
-
-
-
-
- BBS SUPPORT FUNCTIONS
-
-
-
- INTRODUCTION
-
- In this chapter, we discuss a set of utility functions that were
-
- originally developed as a part of a BBS package with one of our
-
- registered users. Not only are they useful, in and of them-
-
- selves, but they also act as examples of using the LiteComm
-
- ToolBox in situations that puzzle some users.
-
-
- ADDITIONAL NOTES
-
- The use of any of the functions that follow in this section re-
-
- quire that you define, in your code, three modem setup strings
-
- with the names MODEMSET0, MODEMSET1, and MODEMSET2, and must be
-
- pointers to characters. In addition, they must be defined as
-
- global variables, and must be public (i.e., not static). Below,
-
- we show one way to do this.
-
-
-
-
- Example
- Example
- Example
-
- char istrng0[] = "ATZ\r";
-
- char istrng1] = "ATT E0 V0 X1 M1\r";
-
- char istrng2[] = "ATS0=1\r";
-
- char *MODEMSET0;
-
- char *MODEMSET1;
-
- char *MODEMSET2;
-
-
- void main(void)
-
- {
-
- ...
-
- MODEMSET0 = &istrng0[0];
-
- MODEMSET1 = &istrng1[0];
-
- MODEMSET2 = &istrng2[0];
-
- ...
-
-
- }
-
-
- Experienced C programmers will readily recognize that this is not
-
- necessarily the best approach. But it does serve to illustrate
-
- clearly the ideas involved. Be sure to define MODEMSET0, 1, and
-
- 2 as pointers to characters as shown above, and NOT as arrays.
-
- It is a fine destinction in C, but an important one.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 54
-
-
-
-
-
- check_for_call
-
-
-
- SUMMARY
-
- include "lcbbs.h";
-
-
- int check_for_call(port)
-
- unsigned port;
-
- DESCRIPTION
-
- This function checks the status of the specified port to deter-
-
- mine whether (1) there is an incoming call and (2) waits for up
-
- to 30 seconds for carrier to be established with the caller if
-
- the phone rang. Please note that this function relies upon, in
-
- part, the HAYES command set. Use with other than HAYES- compat-
-
- ible modems may result in unexpected hangs or other, unpredict-
-
- able results. The function assumes that the modem parameters
-
- have been set in the manner described in the reset_modem func-
-
- tion.
-
-
- In the event that a wrong number call is received, check_for_call
-
- will automatically disconnect by lowering the DTR(Data Terminal
-
- Ready) signal momentarily, then automatically call the reset_mo-
-
- dem function. See the notes at the beginning of this chapter,
-
- and in the discussion of the reset_modem function. This method
-
- of disconnecting, while absolute, will only work correctly if you
-
- HAVE NOT set your modem to ignore the DTR signals, as is possible
-
- with some modems. Please consult your modem's documentation for
-
- additional detail.
-
- RETURN VALUES
-
- If the phone was not ringing, the function returns a value of
-
- zero. If detects a ring was detected, but does not detect
-
- carrier within 30 seconds, the function will return a value of -1
-
- after forcing a disconnect and resetting the modem. Otherwise,
-
- the function returns the numeric result code, in integer form.
-
- It is the programmer's responsibility to interpret and act upon
-
- the result code. For the function to work properly, the modem
-
- must be set to return numeric result codes rather than word re-
-
- sult codes.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 55
-
-
-
-
-
- get_modem_reply
-
-
-
- SUMMARY
-
- include "lcbbs.h"
-
-
- int get_modem_reply(port)
-
- unsigned port;
-
- DESCRIPTION
-
- The get_modem_reply function is intended for use after a command
-
- has been issued to a HAYES compatible modem. To operate proper-
-
- ly, the modem must be set to return numeric responses rather than
-
- word responses. The function returns to the caller when one of
-
- the following occurs:
-
-
- No response from the modem within 1 second.
-
- More than 2 response characters received before a <CR> is de-
-
- tected.
-
- A <CR> is received from the modem.
-
-
- Due to the internal logic employed, the programmer should call
-
- this function, or purge the receive buffer, after each command
-
- sent to the modem. Failure to do so will result in improper in-
-
- terpretation of the result codes returned.
-
- RETURN VALUES
-
- Returns a value of -1 if there is no response from the modem
-
- within 1 second. Otherwise returns the integer result code. If
-
- the modem has not been set to return numeric result codes, the
-
- results are unpredictable.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 56
-
-
-
-
-
- reset_modem
-
-
-
- SUMMARY
-
- include "lcbbs.h"
-
-
- int reset_modem(port)
-
- unsigned port;
-
- DESCRIPTION
-
- The reset_modem function initializes the modem to a known state,
-
- suitable for use with the other bbs functions, and based upon a
-
- set of initialization strings provided by the user's program.
-
- See the notes at the beginning of this chapter for additional
-
- information regarding the way that this must be done.
-
-
- Because the modem-related functions in this section make certain
-
- assumptions about the modem, your initialization strings should
-
- include, at a minimum, the following:
-
- No command echo
-
- Detect carrier
-
-
- Return numeric result codes
-
- Answer the phone on the first ring (if you need to use the
-
- check_for_call function)
-
- A sample set of initialization strings is shown at the start of
-
- this chapter. If you require any additional information on these
-
- or related options, please consult your modem's documentation.
-
- RETURN VALUES
-
-
- The reset_modem function returns the same result code as those
-
- specified for get_modem_reply.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 57
-
-
-
-
-
- disconnect
-
-
-
- SUMMARY
-
- include "lcbbs.h"
-
-
- void disconnect(port)
-
- unsigned port;
-
- DESCRIPTION
-
- The disconnect forcibly disconnects the modem from the telephone
-
- line by lowering the DTR signal momentarily. You must be certain
-
- that your modem IS NOT set to ignore the DTR signal for the
-
- function to work properly.
-
-
- RETURN VALUES
-
- Disconnect returns no values.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 58
-
-
-
-
-
- HAYES MODEM FUNCTIONS
-
-
-
- Note:
- Note:
- Note:When using the following functions, you must include the
-
- file litehcm.h in your program. litehcm.h automatically includes
-
- the litecomm.h header file.
-
-
- FUNCTIONS
-
- lch_codeset
-
- lch_dial
-
- lch_fduplex
-
- lch_hduplex
-
-
- lch_greg
-
- lch_sreg
-
- lch_offcarr
-
- lch_oncarr
-
-
- lch_offecho
-
- lch_onecho
-
- lch_hook
-
- lch_redo
-
-
- lch_numres
-
- lch_wrdres
-
- lch_codesoff
-
- lch_codeson
-
-
- lch_pulse
-
- lch_tone
-
- lch_speaker
-
- _retset
-
- _rettype
-
-
- SUMMARY
-
- #include <litehcm.h>
-
- int lch_codeset(port,mode)
-
- int lch_dial(port,dstr)
-
-
- int lch_fduplex(port)
-
- int lch_hduplex(port)
-
- int lch_greg(port,reg)
-
- int lch_sreg(port,reg,value)
-
-
- int lch_offcarr(port)
-
- int lch_oncarr(port)
-
- int lch_offecho(port)
-
- int lch_onecho(port)
-
-
- int lch_hook(port,hmode)
-
- int lch_redo(port)
-
- int lch_numres(port)
-
- int lch_wrdres(port)
-
-
- int lch_codesoff(port)
-
- int lch_codeson(port)
-
-
- 59
-
-
-
-
-
- int lch_pulse(port)
-
- int lch_tone(port)
-
- int lch_speaker(port,spkmode)
-
- int _retset()
-
-
- int _rettype()
-
- unsigned port;
-
- unsigned mode;
-
- char *dstr;
-
-
- unsigned reg;
-
- int value;
-
- unsigned hmode;
-
- unsigned spkmode;
-
-
- DESCRIPTION
-
- The values to be used with mode, hmode, and spkmode are defined
-
- symbolically in the #include file, litehcm.h.
-
- The lch_codeset
- lch_codeset
- lch_codeset function allows you to change the set of codes
-
- returned by the modem when an action is specified.
-
-
-
- lch_dial
- lch_dial
- lch_dial instructs the modem to dial the number contained in
-
- dstr. Do not include the dialing (ATD) prefix, or the trailing
-
- <\r>. These are provided by the function. You may include non-
-
- numeric characters that are acceptable to your modem, since the
-
- function does not check the contents of dstr. The dialing is in
-
- the last known dialing mode, either pulse or tone. If you use the
-
- lch_pulse or lch_tone functions, then dialing will be done in the
-
- mode that was last correctly enabled. If you have not exercised
-
- these functions, then dialing occurs in the modems default or
-
- power-up mode.
-
-
- The lch_hduplex
- lch_hduplex
- lch_hduplex and lch_fduplex
- lch_fduplex
- lch_fduplex functions place the modem into
-
- local echo and remote echo modes respectively.
-
-
-
- The lch_greg
- lch_greg
- lch_greg function requests that the modem report the current
-
- value of S-register reg. Reg must be in the range 0 to 13. Use
-
- the lc_gets, or similar function, to retrieve the modem's re-
-
- sponse. Specifying a register outside the 0 to 13 range will
-
- cause a return of -1.
-
-
- lch_sreg
- lch_sreg
- lch_sreg is the companion to lch_greg, with the same restric-
-
- tions. Sets the S-register reg to the value contained in value.
-
- If value contains -1, then the register is reset to its default
-
- (power-up) value. The function checks the value to be certain
-
- that it is within the limits specified for the particular regis-
-
- ter, and returns a value of -1 if the value is outside the
-
- predefined limits.
-
-
- lch_offcarr
- lch_offcarr
- lch_offcarr enables modem carrier detect, but disables the mo-
-
- dem's carrier signal. The lch_oncarr companion enables both car-
-
- rier detect and the modem's carrier signal. When lch_offcarr is
-
- used the modem will receive data but will be unable to send data.
-
-
-
- 60
-
-
-
-
-
- The lch_offecho
- lch_offecho
- lch_offecho and lch_onecho
- lch_onecho
- lch_onecho functions determine whether com-
-
- mands sent to the modem are echoed back to the sending program.
-
- With echo turned off, the modem will continue to accept commands,
-
- but will not try to redisplay the command's characters.
-
-
- lch_hook
- lch_hook
- lch_hook allows you to control the status of the modem's tele-
-
- phone line connection. See your modem's documentation and the
-
- include file for additional information.
-
-
-
- The lch_redo
- lch_redo
- lch_redo function instructs the modem to repeat the last
-
- command sequence executed. Generally, this function is of great-
-
- est value in redialing numbers that are busy, although its use is
-
- not restricted to that.
-
-
- The way in which your modem responds to commands is determined,
-
- in part, by the lch_wrdres
- lch_wrdres
- lch_wrdres and lch_numres
- lch_numres
- lch_numres functions. If you call
-
- lch_wrdres, then modem responses use the English language re-
-
- sponse codes, e.g,. CONNECT or OK. Calling lch_numres instructs
-
- the modem to respond with code numbers only from the currently
-
- selected response set, see the lch_codeset function.
-
-
-
- You may use the functions lch_codeson
- lch_codeson
- lch_codeson and lch_codesoff
- lch_codesoff
- lch_codesoff to specify
-
- whether you want your modem to send back response codes when it
-
- receives a command string. In a sense, these act as companions to
-
- the lch_xxxecho functions above.
-
-
- Use the lch_speaker
- lch_speaker
- lch_speaker function to control the modem's internal
-
- speaker, if it has one. See litehcm.h for the applicable codes.
-
-
-
- The _retset
- _retset
- _retset and _rettype
- _rettype
- _rettype functions return, respectively, the last
-
- known command set (lch_codeset) and last known result type
-
- (lch_wrdres, lch_numres). These functions (_retset, _rettype) are
-
- only of value when used with the companion functions.
-
-
- GENERAL REMARKS
-
- Several considerations are in order if you intend to use the
-
- Hayes ToolBox functions.
-
-
-
- You are responsible for checking the return codes from the modem
-
- once you have given modem a command. To make the task easier, we
-
- suggest that you turn OFF command echo. Then you won't have to
-
- worry about separating commands from responses. Finally turn ON
-
- numeric responses to make the interpretation of result codes
-
- easier and faster.
-
-
- Note:
- Note:
- Note:Be sure that you allow adequate time between commands for
-
- the modem to process the command and respond. Failure to observe
-
- this rule may result in commands being misinterpreted or "lost."
-
- You can monitor the number of characters in the receive buffer to
-
- help you with the timing. Or alternatively, check the response
-
- after each command. The latter approach is more in line with what
-
- we believe to be good programming practice.
-
-
- 61
-
-
-
-
-
-
- RETURN VALUES
-
- All functions return a value of -1 if a port or other error oc-
-
- curs, zero otherwise.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 62
-
-
-
- INDEX
- INDEX
- INDEX
-
-
- _lc_error, 18 get_modem_reply, 56, 57
-
- _portchg, 12, 19 handshaking, 7, 8, 9, 10, 18,
-
- _retset, 59, 61 30, 32, 33
-
- _rettype, 59, 61 HAYES, 55, 56, 59, 61
-
- HAYES MODEM FUNCTIONS, 59
-
- 16450, 3, 9
-
- 16550, 3 identification, 4, 6
-
- 8250, 3, 5, 6, 9, 10, 12, 51 INSTALL, 15
-
- 8259, 11, 12, 13 INSTALLATION, 15
-
- interrupt, 4, 5, 6, 9, 10,
-
- Alignment, 10 11, 12, 13, 14, 16, 19, 20,
-
- ASP, 1 22, 28, 30, 32, 33, 52
-
- baud, 5, 6, 7, 11, 14, 20,
-
- 23, 51 IRQ, 11, 12, 13, 19
-
- BBS SUPPORT FUNCTIONS, 54 ISA, 4
-
- ISR, 4, 5
-
- BIOS, 12, 14 lc_clearhwflow, 38, 39
-
- BREAK, 5, 8, 51
-
- buffer, 20, 25, 29, 34, 42, lc_clrmdm, 30, 32, 33
-
- 46, 47, 48, 49, 50, 56, 61 lc_estat, 28, 43
-
- buss, 4, 13 lc_flush, 50
-
- lc_get, 42, 43, 44, 46, 48
-
- C, 14, 15, 16, 18, 22, 54
-
- chain, 13 lc_gets, 48, 60
-
- check_for_call, 17, 55, 57 lc_getstat, 42, 43, 44
-
- COM1, 1, 5, 12, 14 lc_getw, 29
-
- COM2, 8, 11, 12, 14 lc_got, 26, 27
-
- lc_gothwstop, 38, 39, 41
-
- COM3, 11, 12, 13, 14, 19
-
- COM4, 1, 11, 12, 13, 14, 19 lc_gotxoff, 34, 35, 37
-
- comm_close, 20, 22, 32 lc_icnt, 25
-
- comm_opn, 11, 12, 20, 22, 23, lc_mstat, 17, 26, 27
-
- 24, 30 lc_ocnt, 25
-
-
- comm_setup, 23 lc_peek, 46
-
- control, 3, 4, 5, 7, 8, 9, lc_put, 47
-
- 10, 11, 16, 18, 20, 22, 24, lc_puthwstop, 38, 39, 40
-
- 30, 32, 33, 34, 35, 36, 37, lc_puts, 49
-
- 38, 39, 40, 41, 61
-
- debuggers, 14 lc_putxoff, 34, 35, 36, 37
-
- Digiboard, 12 lc_sbrk, 51
-
- lc_setdtr, 30, 31
-
- disconnect, 55, 58 lc_sethwflow, 38, 39, 40, 41
-
- divisor, 5
-
- DTR, 7, 10, 20, 21, 22, 30, lc_setmdm, 10, 30, 31, 32, 33
-
- 31, 32, 33, 38, 55, 58 lc_setrts, 30, 31
-
- echo, 57, 60, 61 lc_setxoff, 34, 35, 36, 37
-
- lc_setxon, 34, 35, 36, 37
-
- EISA, 4
-
- ERROR, 5, 6, 10, 11, 18, 21, lc_togmdm, 30, 32, 33
-
- 22, 23, 24, 25, 26, 28, 35, lc_vport, 24
-
- 36, 37, 38, 39, 40, 41, 43, lc_xoff, 34, 35, 36, 37, 38
-
- 44, 48, 49, 50, 62 lch_codeset, 59, 60, 61
-
- event, 52, 53, 55 lch_codesoff, 59, 61
-
- flow control, 11, 18, 34, 35,
-
- 36, 37, 38, 39, 40, 41 lch_codeson, 59, 61
-
-
-
- INDEX
- INDEX
- INDEX
-
-
- lch_dial, 59, 60 status, 5, 6, 7, 8, 11, 26,
-
- lch_fduplex, 59, 60 27, 28, 31, 42, 43, 44, 48,
-
- lch_greg, 59, 60 50, 55, 61
-
- lch_hduplex, 59, 60 TSR, 16
-
- UART, 3, 9, 12, 51
-
- lch_hook, 59, 61 USECTS, 38
-
- lch_numres, 59, 61
-
- lch_offcarr, 59, 60 USEDSR, 38
-
- lch_offecho, 59, 61 USEDTR, 38
-
- USERTS, 38
-
- lch_onecho, 59, 61 vector, 4, 11, 12, 13, 19
-
- lch_redo, 59, 61
-
- lch_speaker, 59, 61 wait, 42, 43, 44, 45
-
- lch_sreg, 59, 60 warning, 9, 10
-
- warranty, 2
-
- lch_wrdres, 59, 61 workarounds, 9
-
- length, 7, 20
-
- libraries, 15, 16 Xmodem, 2
-
- license, 2 Xmodem-1K, 2
-
- XON-XOFF, 18, 34, 37
-
- memory, 4, 9, 10, 12, 20, 22 YModem, 2
-
- micro-channel, 4
-
- multitasking, 16, 17 ZModem, 2
-
- newtimer_s, 52, 53
-
- NULL, 24, 48
-
-
- open, 8, 9, 10, 11, 12, 14,
-
- 20, 21, 22, 25, 26, 28
-
- OUT2, 7, 30, 32, 33
-
- parity, 7, 10, 20, 23, 28,
-
- 42, 46, 49
-
- PC, 3, 4, 9, 10, 11, 12, 13
-
-
- port, 3, 4, 5, 6, 7, 8, 9,
-
- 10, 11, 12, 13, 14, 16, 19,
-
- 20, 21, 22, 23, 24, 25, 26,
-
- 27, 28, 29, 30, 31, 32, 33,
-
- 34, 35, 36, 37, 38, 39, 40,
-
- 41, 42, 43, 44, 45, 46, 47,
-
- 48, 49, 50, 51, 55, 56, 57,
-
- 58, 60, 62
-
- priority, 4, 13, 19
-
- PS/2, 13, 16
-
- purge, 42, 43, 45, 56
-
-
- register, 5, 6, 7, 8, 12, 43,
-
- 60
-
- Registration, 1, 2
-
- reset_modem, 55, 57
-
- RI, , 17, 44
-
-
- RTS, 7, 10, 20, 22, 30, 31,
-
- 32, 33, 38
-
- Shareware, 1, 2, 16
- ----------------end-of-author's-documentation---------------
-
- Software Library Information:
-
- This disk copy provided as a service of
-
- Public (software) Library
-
- We are not the authors of this program, nor are we associated
- with the author in any way other than as a distributor of the
- program in accordance with the author's terms of distribution.
-
- Please direct shareware payments and specific questions about
- this program to the author of the program, whose name appears
- elsewhere in this documentation. If you have trouble getting
- in touch with the author, we will do whatever we can to help
- you with your questions. All programs have been tested and do
- run. To report problems, please use the form that is in the
- file PROBLEM.DOC on many of our disks or in other written for-
- mat with screen printouts, if possible. PsL cannot debug pro-
- programs over the telephone, though we can answer questions.
-
- Disks in the PsL are updated monthly, so if you did not get
- this disk directly from the PsL, you should be aware that the
- files in this set may no longer be the current versions. Also,
- if you got this disk from another vendor and are having prob-
- lems, be aware that some files may have become corrupted or
- lost by that vendor. Get a current, working disk from PsL.
-
- For a copy of the latest monthly software library newsletter
- and a list of the 3,000+ disks in the library, call or write
-
- Public (software) Library
- P.O.Box 35705 - F
- Houston, TX 77235-5705
-
- Orders only:
- 1-800-2424-PSL
- MC/Visa/AmEx/Discover
-
- Outside of U.S. or in Texas
- or for general information,
- Call 1-713-524-6394
-
- PsL also has an outstanding
- catalog for the Macintosh.
-
-